package com.dji.sample.map.service;

import com.dji.sample.map.model.dto.GroupElementDTO;
import com.dji.sdk.cloudapi.map.*;
import com.dji.sdk.common.HttpResultResponse;

import java.util.List;
import java.util.Optional;

/**
 * 工作空间元素服务接口
 * 定义了对工作空间中地图元素（包括组和元素）进行增删改查操作的方法
 *
 * @author sean
 * @version 0.2
 * @date 2021/11/30
 */
public interface IWorkspaceElementService {

    /**
     * 根据工作空间ID查询所有组信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param workspaceId 工作空间ID
     * @param groupId 组ID，可为空，为空时查询所有组
     * @param isDistributed 是否为分布式查询
     * @return 返回地图元素响应列表，包含组和元素信息
     */
    List<GetMapElementsResponse> getAllGroupsByWorkspaceId(String workspaceId, String groupId, Boolean isDistributed);

    /**
     * 保存地图元素信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param workspaceId 工作空间ID
     * @param groupId 组ID
     * @param elementCreate 地图元素创建请求对象，包含要创建的元素信息
     * @param notify 是否发送通知
     * @return HTTP结果响应对象
     */
    HttpResultResponse saveElement(String workspaceId, String groupId, CreateMapElementRequest elementCreate, boolean notify);

    /**
     * 根据元素ID更新元素信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param workspaceId 工作空间ID
     * @param elementId 元素ID
     * @param elementUpdate 地图元素更新请求对象，包含要更新的元素信息
     * @param username 操作用户名
     * @param notify 是否发送通知
     * @return HTTP结果响应对象
     */
    HttpResultResponse updateElement(String workspaceId, String elementId, UpdateMapElementRequest elementUpdate, String username, boolean notify);

    /**
     * 根据元素ID删除元素信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param workspaceId 工作空间ID
     * @param elementId 元素ID
     * @param notify 是否发送通知
     * @return HTTP结果响应对象
     */
    HttpResultResponse deleteElement(String workspaceId, String elementId, boolean notify);

    /**
     * 根据元素ID查询单个元素信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param elementId 元素ID
     * @return 返回包含元素信息的Optional对象，如果未找到则为空
     */
    Optional<GroupElementDTO> getElementByElementId(String elementId);

    /**
     * 根据组ID删除该组下所有元素信息
     * 包括组内元素的信息以及元素中的坐标信息
     *
     * @param workspaceId 工作空间ID
     * @param groupId 组ID
     * @return HTTP结果响应对象
     */
    HttpResultResponse deleteAllElementByGroupId(String workspaceId, String groupId);

    /**
     * 将GroupElementDTO对象转换为创建WebSocket元素的响应对象
     *
     * @param element GroupElementDTO对象
     * @return 返回用于WebSocket通信的地图元素创建响应对象
     */
    MapElementCreateWsResponse element2CreateWsElement(GroupElementDTO element);

    /**
     * 将GroupElementDTO对象转换为更新WebSocket元素的响应对象
     *
     * @param element GroupElementDTO对象
     * @return 返回用于WebSocket通信的地图元素更新响应对象
     */
    MapElementUpdateWsResponse element2UpdateWsElement(GroupElementDTO element);
}